/**
 * flutter sqflite接口
 * sql 使用文号 ? 作为参数占位符
 * 执行失败会抛出异常，调用接口时需要考虑异常，用 try / catch 包裹
 * /

/**
 * 执行 SQL 语句，无返回值
 * @param sql
 * @param params 参数数组
 * @returns 无返回值
 */
const execute = async (sql: string, params: any) => {
  await window.flutter_inappwebview.callHandler("execute", sql, ...params);
};

/**
 * 插入
 * @param sql
 * @param params 参数数组
 * @returns 返回最后的行id
 */
const insert = async (sql: string, params: any) => {
  const data = await window.flutter_inappwebview.callHandler(
    "insert",
    sql,
    ...params
  );
  // 返回数据结构
  // {"lastRowId": lastRowId};
  return data.lastRowId;
};

/**
 * 更新
 * @param sql
 * @param params 参数数组
 * @returns 返回更新记录行数
 */
const update = async (sql: string, params: any) => {
  const data = await window.flutter_inappwebview.callHandler(
    "update",
    sql,
    ...params
  );
  // 返回数据结构
  // {"count": updateCount,}
  return data.count;
};

/**
 * 删除
 * @param sql
 * @param params 参数数组
 * @returns 返回删除数据行数
 */
const del = async (sql: string, params: any) => {
  const data = await window.flutter_inappwebview.callHandler(
    "delete",
    sql,
    ...params
  );
  // 返回数据结构
  // {"count": deleteCount,}
  return data.count;
};

/**
 * 查询
 * @param sql
 * @param params 参数数组
 * @returns 返回完整路径
 */
const query = async (sql: string, params: any) => {
  const data = await window.flutter_inappwebview.callHandler(
    "query",
    sql,
    ...params
  );
  // 返回数据结构
  return data;
};

/**
 * 批量事务执行，适用于增、删、改 sql，适用于日常业务处理
 * @param list 二维数组 [[sql1, param1, param2], [sql2, param1, param2]]
 * @returns 无返回值
 */
const transaction = async (list: any) => {
  const data = await window.flutter_inappwebview.callHandler(
    "transaction",
    ...list
  );
};

/**
 * 批量执行，适用于增、删、改 sql，适用于大批量初始化数据
 * @param list 二维数组 [[sql1, param1, param2], [sql2, param1, param2]]
 * @returns 无返回值
 */
const batchExecute = async (list: Array<any>) => {
  const data = await window.flutter_inappwebview.callHandler("batch", ...list);
};

export default {
  execute,
  insert,
  update,
  del,
  query,
  transaction,
  batchExecute,
};
